home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbyapp2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-12-22  |  14.4 KB  |  580 lines

  1. (*===========================================================================*)
  2. (* YAPP Protocol processor -- This is mostly Jeff's code                     *)
  3. (*                                                                           *)
  4. (*   Copyright 1986  Jeffry B. Jacobsen.  All rights reserved.               *)
  5. (*   Copyright 1989 by H. Roy Engehausen.  All rights reserved.              *)
  6. (*                                                                           *)
  7. (*   This implements the YAPP(tm) binary transfer protocol (or at least      *)
  8. (*   a subset OF the full protocol - this version does not include the       *)
  9. (*   server commands FOR automated transfer.)                                *)
  10. (*                                                                           *)
  11. (*   This is a modified version OF the actual code used in YAPP FOR the      *)
  12. (*   IBM PC AND compatibles.  Some lines have been deleted that handled      *)
  13. (*   functions such as displaying the status OF the transfer, AND checking   *)
  14. (*   FOR an abort from the keyboard.                                         *)
  15. (*                                                                           *)
  16. (*===========================================================================*)
  17.  
  18. FUNCTION waitready : BOOLEAN;
  19.  
  20.   VAR
  21.     i         : BYTE;
  22.     timer_set : BOOLEAN;
  23.  
  24.   BEGIN;
  25.  
  26.     waitready := false;
  27.     timer_set := FALSE;
  28.  
  29.     REPEAT
  30.       IF timer_set THEN
  31.         BEGIN;
  32.  
  33.           IF timeout THEN           {timeout checks timer value which is}
  34.             BEGIN;
  35.               ptype := TM;          {decremented towards 0 every second }
  36.               waitready := true;
  37.               (* Next lines added by AA4RE for detection *)
  38.               work_string := 'YAPP waitready =' + active_tcb^.i_data.str_data;
  39.               set_dollar1_parm (@work_string);
  40.               showmsg(13);          {error message display}
  41.               (* End addition                            *)
  42.               EXIT;
  43.             END;
  44.  
  45.         END
  46.       ELSE
  47.         BEGIN;
  48.  
  49.           IF send_switch THEN
  50.             i := send_unacked(TRUE)
  51.           ELSE
  52.             i := 0;
  53.  
  54.           send_switch := FALSE;
  55.  
  56.           IF i = 0 THEN
  57.             BEGIN;
  58.               timer_set := TRUE;
  59.               IF (state = S) or (state = S1) THEN
  60.                 set_timer(20)             { 20 seconds to timeout}
  61.               ELSE
  62.                 set_timer(120);           {120 seconds to timeout}
  63.             END;
  64.  
  65.         END;
  66.  
  67.     UNTIL inready;              {inready checks FOR character ready at TNC}
  68.   END;
  69.  
  70. PROCEDURE getpkstr;
  71.  
  72.   VAR
  73.     i  : INTEGER;
  74.     ch : CHAR;
  75.  
  76.   BEGIN
  77.     IF waitready THEN EXIT;
  78.     ch := recvchar;           {recvchar returns character from TNC}
  79.     pklen := ORD(ch);
  80.     IF (ptype = DT) AND (pklen = 0) THEN pklen := 256;
  81.     IF (pklen = 0) THEN EXIT;
  82.     FOR i := 1 to pklen DO
  83.       BEGIN
  84.         IF waitready THEN EXIT;
  85.         ch := recvchar;
  86.         pkbuff[i] := ch;
  87.       END;
  88.    END;
  89.  
  90. PROCEDURE getpack;
  91.  
  92.   VAR
  93.     ch : CHAR;
  94.  
  95.   BEGIN
  96.     ptype := UK;
  97.     IF waitready THEN EXIT;
  98.     ch := recvchar;
  99.  
  100.     CASE ch OF
  101.       ACK:  BEGIN
  102.             IF waitready THEN EXIT;
  103.             ch := recvchar;
  104.             CASE ORD(ch) OF
  105.               1: ptype := RR;
  106.               2: ptype := RF;
  107.               3: ptype := AF;
  108.               4: ptype := AT;
  109.               5: ptype := CA;
  110.               else;
  111.               END;
  112.             END;
  113.       ENQ:  BEGIN
  114.             IF waitready THEN EXIT;
  115.             ch := recvchar;
  116.             CASE ORD(ch) OF
  117.               1: ptype := SI;
  118.               2: ptype := RI;
  119.               ELSE ptype := UU; {unimplemented command}
  120.               END;
  121.             END;
  122.       SOH:  BEGIN
  123.             ptype := HD;
  124.             getpkstr;
  125.             END;
  126.       STX:  BEGIN
  127.             ptype := DT;
  128.             getpkstr;
  129.             END;
  130.       ETX:  BEGIN
  131.             IF waitready THEN EXIT;
  132.             ch := recvchar;
  133.             IF (ORD(ch) = 1) THEN ptype := EF;
  134.             END;
  135.       EOT:  BEGIN
  136.             IF waitready THEN EXIT;
  137.             ch := recvchar;
  138.             IF (ORD(ch) = 1) THEN ptype := ET;
  139.             END;
  140.       NAK:  BEGIN
  141.             ptype := NR;
  142.             getpkstr;
  143.             END;
  144.       CAN:  BEGIN
  145.             ptype := CN;
  146.             getpkstr;
  147.             END;
  148.       DLE:  BEGIN
  149.             ptype := TX;
  150.             getpkstr;
  151.             END;
  152.     ELSE
  153.       BEGIN;
  154.         (* Next lines added by AA4RE for better error explaination *)
  155.         STR(ORD(ch), work_string);
  156.         work_string := 'YAPP getpack (' + work_string + ')';
  157.         set_dollar1_parm (@work_string);
  158.         showmsg(13);          {error message display}
  159.         work_string := 'YAPP getpack2 =' + active_tcb^.i_data.str_data;
  160.         set_dollar1_parm (@work_string);
  161.         (* End addition ------------------------------------------ *)
  162.         showmsg(13);          {error message display}
  163.       END;
  164.     END; {case}
  165.   END;
  166.  
  167.  
  168. PROCEDURE Sendinit;
  169.  
  170.   BEGIN
  171.     Sendinit_Count := 0;
  172.     xmitstr(ENQ + #01);          {send string to TNC}
  173.     getpack;
  174.     CASE ptype OF
  175.       TM : state := S1;
  176.       RI : state := S;
  177.       RR : state := SH;
  178.       RF : state := SD;
  179.       CN : state := C;
  180.       NR : state := Start;
  181.       TX : disppacket;
  182.       ELSE BEGIN
  183.            state := Abort;
  184.            (* Next lines added by AA4RE for better error explaination *)
  185.            STR(ORD(ptype), work_string);
  186.            work_string := 'YAPP Sendinit (' + work_string + ')';
  187.            set_dollar1_parm (@work_string);
  188.            (* End addition ------------------------------------------ *)
  189.            showmsg(13);          {error message display}
  190.            END;
  191.       END;
  192.     END;
  193.  
  194. PROCEDURE Sendinit_retry;
  195.  
  196.   BEGIN
  197.     Sendinit_Count := Sendinit_Count + 1;
  198.     IF (Sendinit_Count > 6) THEN BEGIN
  199.       state := Abort;
  200.       showmsg(12);
  201.       EXIT;
  202.       END;
  203.     xmitstr(ENQ + #01);
  204.     getpack;
  205.     CASE ptype OF
  206.       TM : state := S1;
  207.       RI : state := S;
  208.       RR : state := SH;
  209.       RF : state := SD;
  210.       CN : state := C;
  211.       NR : state := Start;
  212.       TX : disppacket;
  213.       ELSE BEGIN
  214.            state := Abort;
  215.            (* Next lines added by AA4RE for better error explaination *)
  216.            STR(ORD(ptype), work_string);
  217.            work_string := 'YAPP Sendinitretry (' + work_string + ')';
  218.            set_dollar1_parm (@work_string);
  219.            (* End addition ------------------------------------------ *)
  220.            showmsg(13);
  221.            END;
  222.       END;
  223.     END;
  224.  
  225. PROCEDURE Sendhdr;
  226.  
  227.   VAR
  228.     stlen : byte;
  229.     temp  : STRING;
  230.  
  231.   BEGIN
  232.     STR(FILESIZE(pkfile^), temp);
  233.     temp := search_arg + NUL + temp + NUL;
  234.     xferhdr := temp;
  235.     showheader;                          {display}
  236.     stlen := length(temp);
  237.     xmitstr(SOH + chr(stlen) + temp);
  238.     getpack;
  239.     CASE ptype OF
  240.       RF : state := SD;
  241.       CN : state := C;
  242.       NR : state := Start;
  243.       TX : disppacket;
  244.       ELSE BEGIN
  245.            state := Abort;
  246.            IF (ptype = TM) THEN showmsg(12)
  247.              ELSE
  248.                BEGIN;
  249.                  (* Next lines added by AA4RE for better error explaination *)
  250.                  STR(ORD(ptype), work_string);
  251.                  work_string := 'YAPP Sendhdr (' + work_string + ')';
  252.                  set_dollar1_parm (@work_string);
  253.                  (* End addition ------------------------------------------ *)
  254.                  showmsg(13);
  255.                END;
  256.            END;
  257.       END;
  258.     END;
  259.  
  260. PROCEDURE Senddata;
  261.  
  262.   VAR
  263.     bte     : byte;
  264.     i,cnt   : INTEGER;
  265.     temp    : ARRAY [-1..256] OF CHAR;
  266.     ch      : CHAR;
  267.     scancode: INTEGER;
  268.  
  269.   BEGIN
  270.     IF inready THEN BEGIN     {we shouldnt be getting a packet   }
  271.       getpack;                {unless they sent a Cancel or Text }
  272.       IF (ptype = CN) THEN BEGIN
  273.         state := C;
  274.         EXIT;
  275.         END
  276.       ELSE IF (ptype = TX) THEN
  277.         disppacket
  278.       ELSE BEGIN
  279.         WRITELN('Unexpected packet type during Send!');
  280.         state := Abort;
  281.         RUNERROR(yapp_error);
  282.         END;
  283.       END;
  284.     cnt := 0;
  285.     WHILE (not eof(pkfile^)) AND (cnt < bytes_per_block) DO
  286.       BEGIN
  287.       INC(cnt);
  288.       read(pkfile^,bte);
  289.       temp[cnt] := chr(bte);
  290.       END;
  291.     IF cnt <> 0 THEN
  292.       BEGIN
  293. (* modified to send as a block *)
  294.       IF cnt = 256 THEN temp[0] := #0 ELSE temp[0] := CHR(cnt);
  295.       temp[-1] := STX;
  296.  
  297.       send_tnc_data_ub(@temp, cnt + 2);
  298.       END;
  299.  
  300.     send_switch := TRUE;
  301.  
  302. (* end mods *)
  303.  
  304.     IF cnt < bytes_per_block THEN state := SE;
  305.     xfercnt := xfercnt + cnt;
  306.  
  307.     IF show_xmit_count > 0 THEN
  308.       DEC(show_xmit_count)
  309.     ELSE
  310.       BEGIN;
  311.         showbytes;
  312.         show_xmit_count := 3;
  313.       END;
  314.   END;
  315.  
  316. PROCEDURE SendEOF;
  317.  
  318.   BEGIN
  319.     showbytes;
  320.     xmitstr(ETX + #01);
  321.     getpack;
  322.     CASE ptype OF
  323.       AF : state := ST;
  324.       TX : disppacket;
  325.       ELSE BEGIN
  326.            state := Abort;
  327.            IF (ptype = TM) THEN showmsg(12)
  328.              ELSE
  329.                BEGIN;
  330.                  (* Next lines added by AA4RE for better error explaination *)
  331.                  STR(ORD(ptype), work_string);
  332.                  work_string := 'YAPP Sendeof (' + work_string + ')';
  333.                  set_dollar1_parm (@work_string);
  334.                  (* End addition ------------------------------------------ *)
  335.                  showmsg(13);
  336.                END;
  337.            END;
  338.       END;
  339.     END;
  340.  
  341. PROCEDURE SendEOT;
  342.  
  343.   BEGIN
  344.     xmitstr(EOT + #01);
  345.     getpack;
  346.     CASE ptype OF
  347.       AT : state := Start;  {Ack ok}
  348.       TX : disppacket;
  349.       ELSE state := Start;  {They sent AF - so dont worry about it}
  350.     END;
  351.     xferok := TRUE;
  352.   END;
  353.  
  354. PROCEDURE Receive;
  355.  
  356.   BEGIN
  357.     getpack;
  358.     CASE ptype OF
  359.       SI : BEGIN
  360.            showmsg(1);
  361.            xmitstr(ACK + #01);
  362.            state := RH;
  363.            END;
  364.       CN : state := C;
  365.       TX : disppacket;
  366.       ELSE BEGIN
  367.            state := Abort;
  368.            IF (ptype = TM) THEN showmsg(12)
  369.              ELSE
  370.                BEGIN;
  371.                  (* Next lines added by AA4RE for better error explaination *)
  372.                  STR(ORD(ptype), work_string);
  373.                  work_string := 'YAPP Receive (' + work_string + ')';
  374.                  set_dollar1_parm (@work_string);
  375.                  (* End addition ------------------------------------------ *)
  376.                  showmsg(13);
  377.                END;
  378.            END;
  379.       END;
  380. end;
  381.  
  382. PROCEDURE rcvhdr;
  383.  
  384. var
  385.   i : INTEGER;
  386.   temp : line;
  387.  
  388.   BEGIN
  389.     temp := '';
  390.     getpack;
  391.     CASE ptype OF
  392.       HD : BEGIN
  393.            FOR i := 1 to pklen
  394.              DO temp := temp + pkbuff[i];
  395.            xferhdr := temp;
  396.            showheader;
  397.            xmitstr(ACK + #02);
  398.            state := RD;
  399.            END;
  400.       SI : state := RH;
  401.       CN : state := C;
  402.       ET : BEGIN
  403.            xmitstr(ACK + #04);
  404.            state := Start;
  405.            END;
  406.       TX : disppacket;
  407.       ELSE BEGIN
  408.            state := Abort;
  409.            IF (ptype = TM) THEN showmsg(12)
  410.              ELSE
  411.                BEGIN;
  412.                  (* Next lines added by AA4RE for better error explaination *)
  413.                  STR(ORD(ptype), work_string);
  414.                  work_string := 'YAPP Rcvhdr (' + work_string + ')';
  415.                  set_dollar1_parm (@work_string);
  416.                  (* End addition ------------------------------------------ *)
  417.                  showmsg(13);
  418.                END;
  419.            END;
  420.       END;
  421.     END;
  422.  
  423. PROCEDURE RcvData;
  424.  
  425. var
  426.   i : INTEGER;
  427.   bte : byte;
  428.  
  429.   BEGIN
  430.     getpack;
  431.     CASE ptype OF
  432.       DT : BEGIN
  433.            FOR i := 1 to pklen DO
  434.              BEGIN
  435.              bte := ORD(pkbuff[i]);
  436.              write(pkfile^,bte);
  437.              END;
  438.            xfercnt := xfercnt + pklen;
  439.            showbytes;
  440.            state := RD;
  441.            END;
  442.       EF : BEGIN
  443.            close(pkfile^);
  444.            xferok := TRUE;
  445.            showmsg(8);
  446.            xmitstr(ACK + #03);
  447.            state := RH;
  448.            END;
  449.       CN : state := C;
  450.       TX : disppacket;
  451.       ELSE BEGIN
  452.            state := Abort;
  453.            IF (ptype = TM) THEN showmsg(12)
  454.              ELSE
  455.                BEGIN;
  456.                  (* Next lines added by AA4RE for better error explaination *)
  457.                  STR(ORD(ptype), work_string);
  458.                  work_string := 'YAPP Rcvdata (' + work_string + ')';
  459.                  set_dollar1_parm (@work_string);
  460.                  (* End addition ------------------------------------------ *)
  461.                  showmsg(13);
  462.                END;
  463.            END;
  464.       END;
  465.     END;
  466.  
  467. PROCEDURE Cancel;
  468.  
  469.   BEGIN
  470.     xmitstr(CAN + #00);
  471.     state := CW;
  472.   END;
  473.  
  474. PROCEDURE CanWait;
  475.  
  476.   BEGIN
  477.     escmsg(10);
  478.     getpack;
  479.     CASE ptype OF
  480.       CA : state := Start;
  481.       CN : xmitstr(ACK + #05);
  482.       TM : state := Start;
  483.       UK : state := Start;
  484.       TX : disppacket;
  485.       else;
  486.     END;
  487.   END;
  488.  
  489.  
  490. PROCEDURE CanRecd;
  491.  
  492. var
  493.   i : INTEGER;
  494.   bte : byte;
  495.  
  496.   BEGIN
  497.     showmsg(11);
  498.     xmitstr(ACK + #05);
  499.     yapp_delay(3000);   {see IF this helps the stupid TNC-2s problem!}
  500.     state := Start;
  501.   END;
  502.  
  503. PROCEDURE xfer;
  504.  
  505. begin
  506.   xferhdr := '';
  507.   xfercnt := 0;
  508.   xmitline('t');   {put TNC into transparent mode}
  509.   yapp_delay(50);
  510.   txtbuff := '';
  511.   REPEAT
  512.     showstate;     {display state}
  513.     CASE state OF
  514.       S: Sendinit;
  515.      S1: Sendinit_retry;
  516.      SH: Sendhdr;
  517.      SD: Senddata;
  518.      SE: SendEOF;
  519.      ST: SendEOT;
  520.       R: Receive;
  521.      RH: Rcvhdr;
  522.      RD: Rcvdata;
  523.   Abort: Cancel;
  524.      CW: CanWait;
  525.       C: CanRecd;
  526.     else;
  527.     END; {case}
  528.   UNTIL (state = Start);
  529.  
  530.   write(#07);     {bell}
  531.   yapp_delay(1000);    {give TNC some time}
  532.   cmdmode;        {get into command mode}
  533.   flush;
  534.   xmitline('conv');  {back to converse mode}
  535. end;
  536.  
  537. PROCEDURE yapp_download;
  538.  
  539.   BEGIN
  540.  
  541.     show_xmit_count := 3;
  542.  
  543.     ASSIGN(pkfile^, pkfname);
  544.  
  545.     FILEMODE := 0;
  546.     RESET(pkfile^);
  547.     FILEMODE := 2;
  548.  
  549.     free_semaphore(semaphore_interrupts);
  550.  
  551.     set_binary_switch(TRUE);
  552.  
  553.     state := S;
  554.     xfer;
  555.  
  556.     set_binary_switch(FALSE);
  557.  
  558.   END;
  559.  
  560. PROCEDURE yapp_upload;
  561.  
  562.   VAR
  563.     i : INTEGER;
  564.  
  565.   BEGIN
  566.  
  567.     ASSIGN(pkfile^, pkfname);
  568.     REWRITE(pkfile^);
  569.  
  570.     free_semaphore(semaphore_interrupts);
  571.  
  572.     set_binary_switch(TRUE);
  573.  
  574.     state := R;
  575.     xfer;
  576.  
  577.     set_binary_switch(FALSE);
  578.  
  579.   END;
  580.